﻿Ext.data.XmlWriter = Ext.extend(Ext.data.Writer, {

    documentRoot: 'xmlData',


    header: '',


    record: 'record',

    //将记录数组data赋给request的指定属性，request的数据结构将是xml形式的
    writeRecords: function (request, data) {

        // 将数据data编译成xml片段（健为标签名，值为标签内容）
        var tpl = this.buildTpl(request, data);

        // xml片段赋给request的指定属性
        request.xmlData = tpl.apply(data);

        return request;
    },

    // 将数据data编译成xml片段（健为标签名，值为标签内容）
    buildTpl: function (request, data) {
        if (this.tpl) {
            return this.tpl;
        }

        var tpl = [],
            root = this.documentRoot,
            record = this.record,
            first,
            key;

        if (this.header) {
            tpl.push(this.header);
        }

        // 根节点
        tpl.push('<', root, '>');
        if (data.length > 0) {
            // 循环模板，循环输出record代表的标签
            tpl.push('<tpl for="."><', record, '>');
            first = data[0];
            // 输出第一条记录的xml形式的模板（所有记录格式都一样，所以可以使用第一条记录的属性名创建模板）
            for (key in first) {
                if (first.hasOwnProperty(key)) {
                    tpl.push('<', key, '>{', key, '}</', key, '>');
                }
            }
            tpl.push('</', record, '></tpl>');
        }
        tpl.push('</', root, '>');
        this.tpl = new Ext.XTemplate(tpl.join('')); // 便宜成xml片段
        return this.tpl;
    }
});

Ext.data.WriterMgr.registerType('xml', Ext.data.XmlWriter);